#ifndef MINESWEEPER_H
#define MINESWEEPER_H

#include<QMainWindow>
#include<QPainter>
#include<QPaintEvent>
#include<QMouseEvent>
#include<QPixmap>
#include<QRandomGenerator>

#include<QMenu>
#include<QMenuBar>
#include<QAction>

#include<QMessageBox>
#include<dialog.h>

#include<QTimer>

enum Block
{
    zero,one,two,three,four,five,six,seven,eight,bomb,flag,unknown,ohno,question
};

const int BlockHeight=20;
const int BlockWidth=20;

QT_BEGIN_NAMESPACE
namespace Ui { class Minesweeper; }
QT_END_NAMESPACE

class Minesweeper : public QMainWindow
{
    Q_OBJECT

public:
    Minesweeper(QWidget *parent = nullptr);
    ~Minesweeper();

    int nRow;//行数
    int nColumn;//列数
    int nBomb;//炸弹数

    int WindowHeight;//窗口高度
    int WindowWidth;//窗口宽度

    Block data[24][30];//底层
    Block view[24][30];//玩家看到的

    void InitGame();//游戏初始化
    void paintEvent(QPaintEvent *event);//显示格子
    void mousePressEvent(QMouseEvent *event);//鼠标事件
    void RevealBlock(int i,int j);//点到空白的
    void ShowMore(int i,int j);//炸弹标全以后揭开周围

    bool IsNum(Block a);//判断格子是数字还是空白
    bool GameOver;//游戏失败
    bool Win();//游戏胜利
    bool MarkAll(int i,int j);//判断是否标出某个数字周围的所有雷

    //增加菜单栏
    QAction *restart;
    QMenu *menu;

    QAction *easy;//简单模式
    QAction *normal;//中等模式
    QAction *hard;//困难模式
    QAction *self;//自定义难度

    int LeftBomb;//记录剩余炸弹数

    bool first;//判断是否第一次点击就踩雷
    void ResetBomb(int i,int j);//第一次踩雷后重置格子


private:
    Ui::Minesweeper *ui;
    Dialog *DialogSelf;//自定义对话框

    //添加计时功能
    QTimer *runtime;
    int sectime;//秒数显示
    bool timeRecord;//判断点击的位置是否可以启动计时器

private slots:
    void slot_sectime();

public slots:
    void slot_newGame();
    void slot_actionEasy_triggered();
    void slot_actionNormal_triggered();
    void slot_actionHard_triggered();

    void slot_actionSelf_triggered();
    void slot_actionUser_defined_triggered();
};
#endif // MINESWEEPER_H
